5.11. Справочник по Ruby
Справочник по Ruby
1. Основные концепции языка
Ruby — объектно-ориентированный язык программирования с динамической типизацией. В Ruby всё является объектом, включая числа, логические значения и даже классы. Каждый объект принадлежит определённому классу и обладает набором методов.
Философия языка
- Ruby следует принципу «программиста ставят выше машины».
- Язык стремится к выразительности и читаемости кода.
- Ruby предоставляет множество способов выполнить одну и ту же задачу, поддерживая гибкость стиля.
Версии
Актуальная версия на момент 2026 года — Ruby 3.x. Основные изменения в третьей версии:
- Ractors для параллельного выполнения.
- Pattern matching.
- Улучшенная производительность через JIT-компилятор YJIT.
- Строгая типизация не применяется, но есть инструменты вроде RBS и Steep для аннотаций типов.
2. Типы данных
Объекты и классы
Все значения в Ruby — экземпляры классов. Даже литералы создаются как объекты:
42.class # => Integer
"hello".class # => String
true.class # => TrueClass
nil.class # => NilClass
Числовые типы
Integer— целые числа произвольной точности.Float— числа с плавающей запятой (IEEE 754).Rational— рациональные числа (дроби без округления).Complex— комплексные числа.
Примеры:
123 # Integer
123.45 # Float
Rational(3, 4) # Rational
Complex(1, 2) # Complex
Логические типы
true— экземпляр классаTrueClass.false— экземпляр классаFalseClass.- Только
falseиnilсчитаются ложными в условиях. Все остальные значения — истинные.
Строки (String)
Строки в Ruby изменяемы. Поддерживают интерполяцию, кодировки, регулярные выражения.
Создание:
str = "Hello"
str = 'Hello' # Без интерполяции
str = %Q(Hello #{name})
str = %q(Hello)
Методы:
.length,.size.upcase,.downcase,.capitalize.strip,.lstrip,.rstrip.gsub,.sub.include?,.start_with?,.end_with?.split,.join.chomp,.chop.ord,.chr.encoding,.force_encoding
Символы (Symbol)
Символы — неизменяемые строкоподобные объекты, часто используемые как ключи хешей или имена методов.
Примеры:
:name
:"first name"
%I[apple banana]
Особенности:
- Символы хранятся в пуле, повторное использование одного символа даёт один и тот же объект.
- Метод
.to_symпреобразует строку в символ. - Метод
.to_sпреобразует символ в строку.
Массивы (Array)
Упорядоченные коллекции объектов любого типа.
Создание:
arr = [1, 2, 3]
arr = Array.new(5, 0) # [0, 0, 0, 0, 0]
arr = %w[apple banana] # ["apple", "banana"]
Методы:
.length,.size,.empty?.first,.last.push,.pop,.shift,.unshift.<<(добавление в конец).each,.map,.select,.reject,.find.index,.rindex.slice,.[].flatten,.compact,.uniq.sort,.reverse.include?.zip,.transpose
Хеши (Hash)
Ассоциативные массивы с парами ключ-значение.
Создание:
hash = { name: "Alice", age: 30 }
hash = { "name" => "Alice", "age" => 30 }
hash = Hash.new("default")
Методы:
.keys,.values.key?,.has_key?,.value?,.has_value?.fetch,.[].merge,.merge!.each,.each_key,.each_value.transform_keys,.transform_values.invert.default,.default=
Диапазоны (Range)
Представляют последовательность значений между двумя границами.
Примеры:
(1..5) # включительно
(1...5) # исключая правую границу
('a'..'z')
Методы:
.include?,.cover?.each,.map.to_a.begin,.end,.exclude_end?
Регулярные выражения (Regexp)
Объекты для работы с шаблонами текста.
Создание:
/abc/
%r{abc/i}
Regexp.new("abc", Regexp::IGNORECASE)
Методы:
.match,.match?.scan.gsub,.sub.source,.options
Флаги:
i— игнорировать регистрm— многострочный режим (.захватывает\n)x— расширенный синтаксис (игнорировать пробелы и комментарии)o— компилировать один раз
Процедуры и блоки
Proc— объект, содержащий блок кода.Lambda— особый видProcс проверкой арности.
Создание:
proc = Proc.new { |x| x * 2 }
lambda = ->(x) { x * 2 }
Методы:
.call.arity.lambda?
nil
Значение nil представляет отсутствие значения. Это единственный экземпляр класса NilClass.
3. Операторы
Арифметические
+,-,*,/,%,**
Сравнения
==,!=,<,>,<=,>=<=>— оператор сравнения (возвращает -1, 0, 1)===— используется вcaseи для проверки принадлежности
Логические
&&,||,!and,or,not— с низким приоритетом
Присваивание
=,+=,-=,*=,/=,%=,**=- Параллельное присваивание:
a, b = 1, 2 - Распаковка:
head, *tail = [1,2,3,4]
Условные
- Тернарный оператор:
condition ? true_val : false_val
Диапазон
..— включающий диапазон...— исключающий диапазон
Обращение к методам
.,&.(безопасная навигация)
4. Управляющие конструкции
Условия
if condition
# ...
elsif other_condition
# ...
else
# ...
end
unless condition
# выполняется, если условие ложно
end
Модификаторы:
puts "OK" if ready?
exit unless confirmed?
Циклы
while condition
# ...
end
until condition
# ...
end
Модификаторы:
do_something while running?
retry if failed?
Итераторы (предпочтительный стиль):
5.times { puts "Hello" }
(1..10).each { |i| puts i }
array.each_with_index { |item, index| ... }
Выбор (case)
case value
when 1
# ...
when 2..5
# ...
when String
# ...
else
# ...
end
Pattern matching (Ruby 3+):
case data
in { name:, age: Integer => a } if a > 18
puts "#{name} is adult"
end
Исключения
begin
risky_operation
rescue SpecificError => e
handle_error(e)
rescue StandardError => e
log_error(e)
else
# если исключений не было
ensure
# всегда выполняется
end
Выброс исключения:
raise "Error message"
raise CustomError, "Details"
5. Методы
Определение
def method_name(param1, param2 = default, *args, **kwargs, &block)
# тело метода
return value
end
Особенности:
- Параметры по умолчанию.
*args— сбор всех позиционных аргументов в массив.**kwargs— сбор именованных аргументов в хеш.&block— захват блока как объектаProc.
Возврат
- Последнее вычисленное выражение возвращается автоматически.
- Явный
returnзавершает метод.
Область видимости
private— метод вызываем только внутри объекта.protected— метод вызываем только внутри объектов того же класса.public— метод доступен извне.
Предопределённые методы
initialize— конструктор.to_s,inspect— строковое представление.==,eql?,equal?— сравнение.hash— для использования в хешах.clone,dup— копирование.
6. Классы и объекты
Определение класса
class MyClass
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}"
end
end
Переменные экземпляра
- Начинаются с
@. - Доступны во всех методах экземпляра.
Переменные класса
- Начинаются с
@@. - Совместно используются всеми экземплярами и подклассами.
Константы
- Имена в верхнем регистре:
MAX_SIZE = 100. - Доступны глобально, но предпочтительно ограничивать область.
Наследование
class Child < Parent
# ...
end
- Ruby поддерживает одиночное наследование.
- Метод
superвызывает реализацию из родителя.
Модули
Модули служат для:
- Группировки методов (
Math.sqrt). - Реализации миксинов (через
include,prepend,extend).
Пример:
module Greetable
def greet
"Hi!"
end
end
class Person
include Greetable
end
Singleton-методы и классовые методы
def MyClass.class_method
# ...
end
# или
class << self
def another_class_method
# ...
end
end
7. Стандартная библиотека Ruby
Ruby поставляется с обширной стандартной библиотекой, доступной без установки дополнительных гемов.
Работа с файлами и директориями
Класс File:
.read,.write,.open.exist?,.file?,.directory?.size,.mtime,.atime.basename,.dirname,.extname
Класс Dir:
.entries,.foreach.glob— поиск по шаблону (Dir.glob("*.rb")).mkdir,.rmdir
Модуль Pathname:
- Объектно-ориентированный интерфейс для путей.
- Пример:
Pathname.new("docs").join("readme.md")
Время и дата
Класс Time:
Time.now.utc,.local.strftime— форматирование- Арифметика:
Time.now + 3600
Класс Date и DateTime (из date):
- Точное календарное представление.
- Поддержка часовых поясов через
TZInfo.
Регулярные выражения
Уже упомянуты, но дополнительно:
- Метод
String#scanвозвращает все совпадения. - Группы захвата доступны через
$1,$2, ...,$~.
Сетевые возможности
Net::HTTP— HTTP-клиент.URI— парсинг и построение URL.Socket— низкоуровневые сокеты.OpenSSL— криптография и TLS.
JSON и YAML
JSON.parse,JSON.generateYAML.load,YAML.dump(требуетrequire 'yaml')
Потоки и параллелизм
Thread— потоки выполнения.Mutex— примитив синхронизации.Queue— потокобезопасная очередь.Ractor(Ruby 3+) — изолированные акторы для параллельного выполнения без общего состояния.
Тестирование
Test::Unit— встроенный фреймворк.minitest— современная альтернатива (часто используется как замена).assert,assert_equal,assert_raises
Логирование
Logger— простой логгер с уровнями:debug,info,warn,error,fatal.
Утилиты
OptionParser— разбор аргументов командной строки.CSV— работа с CSV-файлами.Base64— кодирование и декодирование.Digest— хеширование (MD5, SHA1, SHA256).
8. Метапрограммирование
Ruby предоставляет мощные средства для изменения поведения программ во время выполнения.
Динамическое определение методов
define_method(:greet) do |name|
"Hello, #{name}"
end
Методы отсутствующих методов
def method_missing(name, *args)
if name.to_s.start_with?("find_by_")
# реализация динамического поиска
else
super
end
end
Рекомендуется переопределять respond_to_missing? при использовании method_missing.
Открытие классов
Любой класс можно расширить в любой момент:
class String
def blank?
self.strip.empty?
end
end
Eval-методы
eval— выполняет строку как код Ruby.instance_eval— выполняет в контексте объекта.class_eval— выполняет в контексте класса.
Интроспекция
Методы для анализа структуры:
.methods,.public_methods,.private_methods.instance_variables,.class_variables.ancestors— цепочка наследования.singleton_class— класс объекта.is_a?,.kind_of?,.instance_of?
Константы и модули
const_get,const_set,const_defined?Module.nesting— текущий контекст вложенности
9. Особенности выполнения
Интерпретатор
- Официальный интерпретатор — MRI (Matz’s Ruby Interpreter).
- Альтернативы: JRuby (на JVM), TruffleRuby (GraalVM), Rubinius.
JIT-компиляция
- YJIT (Yet Another JIT) — встроен в Ruby 3.3+, значительно ускоряет выполнение CPU-интенсивных задач.
Управление памятью
- Автоматическая сборка мусора (mark-and-sweep + generational GC).
- Настройки через переменные окружения:
RUBY_GC_HEAP_INIT_SLOTS,RUBY_GC_MALLOC_LIMIT.
Загрузка кода
require— загружает файл один раз.load— загружает каждый раз при вызове.$LOAD_PATH($:) — список путей для поиска файлов.
Переменные окружения
ENV— хеш с переменными окружения.- Пример:
ENV["HOME"],ENV["RACK_ENV"]
Выход и завершение
exit— завершает программу.exit!— немедленный выход без выполненияat_exit.at_exit { ... }— блок, выполняемый при завершении.
10. Инструменты разработки
Bundler
- Управление зависимостями через
Gemfile. - Команды:
bundle install,bundle update,bundle exec.
Rake
- Система задач, аналог Make.
- Файл
Rakefileсодержит задачи:task :build do ... end.
IRB и Pry
- Интерактивная оболочка Ruby.
- Pry — расширенная альтернатива с интроспекцией и отладкой.
Отладка
binding.irbилиbinding.pry— точка останова.debuggem — официальный отладчик (входит в Ruby 3.1+).
Профилирование
ruby-prof— анализ производительности.stackprof— профилировщик на основе стека.
Форматирование и стиль
RuboCop— проверка стиля и лучшие практики.- Поддерживает кастомные правила и автоматическое исправление.
Тестирование
RSpec— BDD-фреймворк.Cucumber— acceptance-тесты на естественном языке.FactoryBot— генерация тестовых данных.
11. Практические рекомендации
Именование
- Переменные и методы:
snake_case. - Классы и модули:
PascalCase. - Константы:
UPPER_SNAKE_CASE.
Читаемость
- Избегать длинных методов (рекомендуется до 10–15 строк).
- Использовать говорящие имена.
- Предпочитать итераторы (
each,map) цикламfor.
Безопасность
- Не использовать
evalс пользовательским вводом. - Экранировать данные при работе с системой (
Shellwords.shellescape). - Использовать параметризованные запросы при работе с базами данных.
Производительность
- Избегать создания лишних объектов в циклах.
- Использовать символы вместо строк как ключи хешей.
- Кэшировать результаты тяжёлых вычислений.
Совместимость
- Указывать версию Ruby в
.ruby-version. - Использовать
RUBY_VERSIONдля условной логики. - Тестировать на целевых версиях через CI.
12. Полезные константы и глобальные переменные
Константы
RUBY_VERSION— версия интерпретатора.RUBY_PLATFORM— платформа (например,"x86_64-linux").__FILE__— имя текущего файла.__LINE__— номер текущей строки.__dir__— каталог текущего файла.
Глобальные переменные
$0— имя запущенного скрипта.$ARGV— аргументы командной строки.$stderr,$stdout,$stdin— потоки ввода-вывода.$?— статус последнего завершённого процесса.$!— последнее исключение.$@— трассировка стека последнего исключения.
13. Распространённые идиомы Ruby
Безопасная навигация
user&.profile&.avatar_url
Хеш с блоком по умолчанию
counter = Hash.new(0)
counter[:apple] += 1
Массив как очередь
queue = []
queue << item # enqueue
item = queue.shift # dequeue
Параллельное присваивание
a, b = b, a # обмен значениями
Блок как замыкание
def make_adder(x)
->(y) { x + y }
end
add5 = make_adder(5)
add5.(3) # => 8
Использование tap
result = [1,2,3].tap { |x| puts x.inspect }
Цепочка методов
users.select(&:active?)
.map(&:name)
.sort
14. Взаимодействие с внешними системами
Выполнение системных команд
Ruby предоставляет несколько способов запуска внешних программ:
-
Обратные кавычки:
output = `ls -l` -
Метод
system:success = system("git", "status") -
Класс
Open3(из стандартной библиотеки):require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("grep", "pattern") -
Класс
Process: управление процессами, PID, сигналы (Process.kill,Process.wait).
Работа с переменными окружения
Доступ через хеш ENV:
ENV["DATABASE_URL"] = "postgres://..."
Изменения в ENV влияют на дочерние процессы.
Чтение аргументов командной строки
- Глобальный массив
ARGVсодержит переданные аргументы. - Для сложного парсинга используется
OptionParser:require 'optparse'
options = {}
OptionParser.new do |opts|
opts.on("-v", "--verbose", "Run verbosely") { options[:verbose] = true }
end.parse!
Работа с базами данных
Хотя Ruby не включает драйверы БД в ядро, стандартная практика — использование адаптеров:
SQLite3— встраиваемая БД, часто используется для обучения.pg— драйвер PostgreSQL.mysql2— драйвер MySQL.
Пример с SQLite:
require 'sqlite3'
db = SQLite3::Database.new('app.db')
db.execute("CREATE TABLE IF NOT EXISTS users (name TEXT)")
db.execute("INSERT INTO users VALUES (?)", ["Alice"])
db.execute("SELECT * FROM users") { |row| p row }
15. Веб-разработка на Ruby
Минимальный HTTP-сервер
require 'webrick'
server = WEBrick::HTTPServer.new(Port: 8080)
server.mount_proc('/') { |req, res| res.body = "Hello from Ruby!" }
trap('INT') { server.shutdown }
server.start
Sinatra (микрофреймворк)
Лёгкий фреймворк для создания веб-приложений:
require 'sinatra'
get '/' do
"Hello World"
end
get '/user/:name' do
"Hello, #{params[:name]}"
end
Запуск: ruby app.rb
Ruby on Rails (полноценный фреймворк)
Rails следует принципам MVC и convention over configuration.
Основные компоненты:
- Models — работа с данными через Active Record.
- Views — шаблоны (ERB, Slim, Haml).
- Controllers — логика обработки запросов.
- Routes — маршрутизация URL.
- Migrations — управление схемой БД.
- Gems — расширения (Devise, Sidekiq, Pundit и др.).
Пример модели:
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
has_many :posts
end
Команды Rails:
rails new my_apprails generate model User name:stringrails db:migraterails server
API-разработка
Rails может работать как API-only приложение:
rails new my_api --api
Используется JSON-ответы, отключены представления и CSRF-защита.
16. Популярные гемы (библиотеки)
| Гем | Назначение |
|---|---|
nokogiri | Парсинг HTML/XML |
httparty | Упрощённый HTTP-клиент |
faraday | Гибкий HTTP-клиент с middleware |
dotenv | Загрузка .env файлов |
pry | Расширенная REPL-оболочка |
sidekiq | Фоновые задачи через Redis |
rspec | BDD-тестирование |
factory_bot | Фабрики для тестовых данных |
rubocop | Анализ стиля кода |
puma | Современный веб-сервер |
dry-rb | Коллекция функциональных утилит (dry-validation, dry-types) |
Установка гема:
gem install gem_name
Или через Gemfile + bundle install.
17. Интеграции и реальные сценарии
Чтение и запись CSV
require 'csv'
CSV.foreach("data.csv", headers: true) do |row|
puts row["name"]
end
CSV.open("output.csv", "w") do |csv|
csv << ["name", "age"]
csv << ["Alice", 30]
end
Генерация отчётов
Сочетание ERB и File:
template = ERB.new(File.read("report.erb"))
result = template.result(binding)
File.write("report.html", result)
Автоматизация задач
Rake-файлы для ежедневных операций:
task :backup do
system("tar -czf backup.tar.gz data/")
puts "Backup created"
end
Запуск: rake backup
Телеграм-боты
С использованием гема telegram-bot-ruby:
bot = Telegram::Bot::Client.new(TOKEN)
bot.listen do |message|
bot.api.sendMessage(chat_id: message.chat.id, text: "Echo: #{message.text}")
end
18. Обучение и использование в образовательных целях
Почему Ruby подходит для обучения
- Простой и читаемый синтаксис.
- Минимум шаблонного кода.
- Быстрый старт: «Hello World» — одна строка.
- Возможность показать объектную модель без сложных абстракций.
- Поддержка функционального стиля через блоки.
Примеры учебных задач
- Калькулятор — демонстрация условий и методов.
- Список дел (To-Do) — работа с массивами и циклами.
- Книжный каталог — классы, хеши, файлы.
- Веб-скрапинг —
Nokogiri+HTTParty. - Тестирование — написание первого RSpec-теста.
Безопасность при обучении
- Избегать выполнения пользовательского кода через
eval. - Использовать изолированные среды (Docker, sandbox).
- Ограничивать сетевые вызовы в учебных заданиях.
Демонстрационные проекты
- Генератор документации.
- Консольный чат с логированием.
- REST-клиент для публичного API (например, GitHub).
- Скрипт резервного копирования.
19. Советы по структуре проекта
Хорошо организованный Ruby-проект включает:
my_project/
├── bin/ # исполняемые скрипты
├── lib/ # основной код
│ └── my_project.rb
├── spec/ # тесты (если используется RSpec)
├── test/ # тесты (если используется Minitest)
├── Gemfile # зависимости
├── Gemfile.lock # зафиксированные версии гемов
├── README.md # описание проекта
├── Rakefile # задачи автоматизации
├── .ruby-version # версия Ruby
├── .rubocop.yml # правила стиля
└── config.ru # если это Rack-приложение
Для библиотек — модульное пространство имён:
# lib/my_project/core.rb
module MyProject
class Core
# ...
end
end